// Script de comportement des cartes pour le jeu Twins

using UnityEngine;
using System.Collections;

public class TwinsBehaviourScript : MonoBehaviour {

	//
	// Definition des variables
	//
	private Texture2D myTexture;
	public Object cardPrefab;
	public GameObject[] eachCard;
	private Vector3 positionCard;
	private Object[] myTextures; // Liste de toutes les textures du répertoire
	private string gameType; // Type de jeu : "Ludo", "LudoEducatif", "Educatif"
	private string difficulty; // Niveau de difficulté du jeu "Easy", "Medium", "Hard"

	//
	// Use this for initialization
	//
	void Start () {

		// Charge le Prefab des cartes
		//cardPrefab = AssetDatabase.LoadAssetAtPath("Assets/Prefabs/Twins/CardTwins.prefab", typeof(GameObject));
		cardPrefab = Resources.Load("Prefabs/Twins/CardTwins", typeof(GameObject));

		// Recupération de la variable globale pour la difficulté du jeu sélectionnée
		difficulty = PlayerPrefs.GetString ("difficultyLevel");

		// Charge depuis le dossier "Resources" toutes les tetxures présentes
		switch (difficulty) {
			case "Hard":
				myTextures = Resources.LoadAll ("Textures/Common/Letters");
				break;
			case "Medium":
				myTextures = Resources.LoadAll ("Textures/Common/Numbers");
				break;
			case "Easy":
				myTextures = Resources.LoadAll ("Textures/Common/Images");
				break;
		}

		// Création des 6 clones pour les cartes à taper
		eachCard = new GameObject[7];

		for (int i=0; i<=6; i++) {
			eachCard[i] = Instantiate(cardPrefab, Vector3.zero, Quaternion.identity) as GameObject;
		}

		eachCard[0].transform.FindChild("Front").localScale += new Vector3(2, 2, 0);

		StartCoroutine ( DefineCards() );

	}

	//
	// Update is called once per frame
	//
	void Update () {
		if (Input.GetMouseButtonDown (0)) {
			Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
			RaycastHit hit;

			if (Physics.Raycast (ray, out hit, 100)) {
				//Debug.LogError("Carte "+hit.collider.GetInstanceID());
				//Debug.LogError("Ref "+eachCard[0].GetInstanceID());
				if ((hit.collider.name == eachCard[0].name) && (hit.collider.GetInstanceID() != eachCard[0].transform.GetInstanceID())) {
					StartCoroutine ( DefineCards() );
				} else {
					#if !UNITY_STANDALONE
					Handheld.Vibrate ();
					#endif
					iTween.ShakePosition (Camera.main.gameObject, new Vector3 (0.1f, 0.1f, 0.1f), 0.5f);				
				}
			}
		}
	}

	//
	// Fonction pour gérer la textures des cartes
	//
	private IEnumerator DefineCards() {

		// Initialisation des variables
		bool[] textureIsUsed;
		textureIsUsed = new bool[myTextures.Length];
		//Debug.LogError (textureIsUsed [1]);
		int i = 1;
		int textureChoosed;
		// Boucle de création des cartes
		for (int y = 2; y >=-2; y=y-4) {
			for(int x = -2; x <= 2; x=x+2) {
				// Calcul de la position de chaque carte
				positionCard.Set(x, y, -1);
				// Création de chaque clone du Prefab
				eachCard[i].transform.position = positionCard;
				// Tirage au sort d'une texture
				do {
					textureChoosed = Random.Range (0, myTextures.Length);
				} while(textureIsUsed[textureChoosed] == true);
				textureIsUsed[textureChoosed] = true;
				// Modification de la texture de chaque carte
				eachCard[i].transform.FindChild("Front").GetComponent<Renderer>().material.mainTexture = myTextures[textureChoosed] as Texture2D;
				// Attribution d'un nom à chaque carte
				eachCard[i].name = myTextures[textureChoosed].name;
				// Incrémentation
				i++;
			}
		}

		// Création de la carte de référence
		positionCard.Set(-6, 0, -1);
		textureChoosed = Random.Range (1, 7);
		//eachCard[0] = Instantiate(cardPrefab, Vector3.zero, Quaternion.identity) as GameObject;
		eachCard[0].transform.position = positionCard;
		eachCard[0].transform.FindChild("Front").GetComponent<Renderer>().material.mainTexture = eachCard[textureChoosed].transform.FindChild("Front").GetComponent<Renderer>().material.mainTexture;
		eachCard[0].name = eachCard[textureChoosed].name;

		// Le collider de la carte de référence est désactivée pour ne pas cliquer dessus
		(eachCard[0].GetComponent(typeof(Collider)) as Collider).enabled = false;

		yield return 0;
	}

}